package monopoli.game;


import monopoli.Monopoli;
import java.util.*;

public class Partita {

    private int prossimoGiocatore;
    private int numeroGiocatori;
    //indica il giocatore che gioca su questa istanza
    private int giocatoreSessione;
    private Tabellone tabellone;
    private Banca banca;
    private Mazzo mazzoProprieta;
    private Mazzo mazzoProbabilita;
    private Mazzo mazzoImprevisti;
    private ArrayList<Giocatore> giocatore;
    private ArrayList<Dado> dado;
   
    private GameToGUI game2GUI;
    private GameToCommunication game2Communication;

    public Partita() {

        game2GUI = new GameToGUI();
        game2Communication = new GameToCommunication();

    }




    public void inizializzaPartita() {

        //Inizializzazione Tabellone
        tabellone = new Tabellone();
        tabellone.inizializzaTabellone();
        tabellone.stampaCaselle();

        //Altera tabellone per test
        //testTabellone();

        //Inizializzazione Carte Propriet??, Carte Imprevisto e Probabilit??
        this.inizializzaCarte();

        //Inizializzazione Banca
        banca = new Banca();
        banca.inizializza();

        //Inizializzazione accessori (dadi e pedine)
        dado = new ArrayList<Dado>();
        dado.add(new Dado());
        dado.add(new Dado());

        //Inizializzazione dei giocatori
        giocatore = new ArrayList<Giocatore>();
    }

    public void completaInizializzazionePartita() {

        Monopoli.getMonopoliGUI().debugMessage("[DBG_game] Completamento inizializzazione partita");
        int idGiocatoreMin = 1000;
        ArrayList giocatori = this.getGiocatore();
        Giocatore g = null;
        int contaGiocatori = 0;
        Iterator it = giocatori.iterator();
        while (it.hasNext()) {
            contaGiocatori++;
            g = (Giocatore) it.next();
            if (g.getId() < idGiocatoreMin) {
                idGiocatoreMin = g.getId();
            }
            this.tabellone.posizionaPedina((g.getPedina()), 0);
        }
        
        prossimoGiocatore = idGiocatoreMin;
        numeroGiocatori = contaGiocatori;

        Monopoli.getMonopoliGUI().debugMessage("[DBG_game] Avvio della partita con giocatori n??" + numeroGiocatori + ". Il primo turno ?? del giocatore id" + prossimoGiocatore);
    }

    public int partecipa() {
        Monopoli.getMonopoliGUI().debugMessage("*   Partecipa alla partita");
        Giocatore g = new Giocatore();
        g.inizializza();
        int idGiocatore = g.getId();
        Monopoli.getMonopoliGUI().debugMessage("*   Partecipa alla partita il giocatore :" + idGiocatore );
        this.giocatore.add(g);
        this.setGiocatoreSessione(idGiocatore);
        return idGiocatore;
}

    public void comunicaGiocatore(int idGiocatore) {
        Monopoli.getMonopoliGUI().debugMessage("[DBG_game] Giocatore " + idGiocatore);
        Giocatore g = ricavaGiocatoreSessione();
        Monopoli.getMonopoliCommunication().richiestaPartecipaPartita(idGiocatore);
    }
    
    public void comunicaNome(String nomeGiocatore,int idGiocatore) {
        Monopoli.getMonopoliGUI().debugMessage("[DBG_game] Giocatore " + idGiocatore + " - " + nomeGiocatore);
        Giocatore g = ricavaGiocatoreSessione();
        g.setNome(nomeGiocatore);
        Monopoli.getMonopoliGUI().AggiornaSommario("nomeGiocatore", nomeGiocatore);
        Monopoli.getMonopoliCommunication().notificaNome(idGiocatore, nomeGiocatore);
    }

     public void comunicaPedina(int pedina, int idGiocatore) {
        Monopoli.getMonopoliGUI().debugMessage("[DBG_game] Pedina " + pedina);
        Giocatore g = ricavaGiocatoreSessione();
        g.setPedina(new Pedina(pedina));
        Monopoli.getMonopoliGUI().AggiornaSommario("pedina", pedina);

        //TODO
        //SPOSTARE PoSIZIONE!
        //posiziono la pedina
        
         Pedina  p= g.getPedina();
        String s = monopoli.gui.Pedina.idToName(p.getId());
        Monopoli.getMonopoliGUI().aggiungiPedina(0, s);
        

        Monopoli.getMonopoliCommunication().notificaPedina(idGiocatore, pedina);
    }

    public ArrayList<Dado> getDado() {
        return dado;
    }



    public int ricavaPedina(String s) {

        Iterator<Giocatore> it = getGiocatore().iterator();
        while(it.hasNext()) {
            Giocatore g = it.next();
            if((g.getNome().compareTo(s))==0)
                return g.getPedina().getId();
        }

        return 0;
    }

    public void setDado(ArrayList<Dado> val) {
        this.dado = val;
    }

    public ArrayList<Giocatore> getGiocatore() {
        return giocatore;
    }

    public void setGiocatore(ArrayList<Giocatore> val) {
        this.giocatore = val;
    }

    public Mazzo getMazzoProprieta() {
        return mazzoProprieta;
    }

    public void setMazzoProprieta(Mazzo val) {
        this.mazzoProprieta = val;
    }

    public Mazzo getMazzoProbabilita() {
        return mazzoProbabilita;
    }

    public void setMazzoProbabilita(Mazzo val) {
        this.mazzoProbabilita = val;
    }

    public Mazzo getMazzoImprevisti() {
        return mazzoImprevisti;
    }

    public void setMazzoImprevisti(Mazzo val) {
        this.mazzoImprevisti = val;
    }

    public Tabellone getTabellone() {
        return tabellone;
    }

    public void setTabellone(Tabellone val) {
        this.tabellone = val;
    }

    public Banca getBanca() {
        return banca;
    }

    public void setBanca(Banca b) {
        banca = b;
    }

    public int getProssimoGiocatore() {
        return prossimoGiocatore;
    }

    public void setProssimoGiocatore(int val) {
        this.prossimoGiocatore = val;
    }

    public int getGiocatoreSessione() {
        return  giocatoreSessione;

    }

    public void setGiocatoreSessione(int val) {
        this.giocatoreSessione = val;
    }

    public int getNumeroGiocatori() {
        return prossimoGiocatore;
    }

    public void setNumeroGiocatori(int val) {
        this.prossimoGiocatore = val;
    }

    public GameToGUI getGameToGUI() {
        return this.game2GUI;
    }

    public GameToCommunication getGameToCommunication() {
        return this.game2Communication;
    }

    public Giocatore ricavaGiocatoreSessione() {
        int idGiocatore = this.giocatoreSessione;
        Giocatore g = null;
        Iterator it = this.giocatore.iterator();
        Boolean stop = false;
        while(it.hasNext() && stop == false) {
            g = (Giocatore)it.next();
            if (g.getId() == idGiocatore)
                stop=true;
        }
        return g;
    }

    public void inizializzaCarte() {

        Monopoli.getMonopoliGUI().debugMessage("[DBG_game] Inizializzazione delle carte");
        mazzoProprieta = new Mazzo();
        mazzoProprieta.inizializzaMazzo(1);
        mazzoProprieta.stampaMazzo();
        mazzoProprieta.mescola();

        mazzoProbabilita = new Mazzo();
        mazzoProbabilita.inizializzaMazzo(2);
        mazzoProbabilita.stampaMazzo();
        mazzoProbabilita.mescola();

        mazzoImprevisti = new Mazzo();
        mazzoImprevisti.inizializzaMazzo(3);
        mazzoImprevisti.stampaMazzo();
        mazzoProbabilita.mescola();
    }

    public int lancioDadi() {
        //funzione che gestisce il passaggio di turno e l'inizio del nuovo
        int res=0;
        Giocatore g;
        Dado d1, d2;

        //azzero i pulsanti
        Monopoli.getMonopoliGUI().azzeraPulsanti();


        
        Monopoli.getMonopoliGUI().debugMessage("[DBG_game] Turno giocatore " + prossimoGiocatore);

        //CASO TURNO MIO
        //if (this.ricavaGiocatoreSessione().getIdOrdine() == prossimoGiocatore) {
            g = this.ricavaGiocatoreSessione();
            res = this.getGameToGUI().lanciaDadi();
            //res = 1;
            Monopoli.getMonopoliGUI().debugMessage("[DBG_game] Risultato lancio dadi: " + res);
            Casella casellaOld =g.getPedina().getPosizione();
            String sCasellaOld = casellaOld.getNomeEsteso();
            this.tabellone.avanzaPedina(g.getPedina(), res);
            String casellaNew = g.getPedina().getPosizione().getNomeEsteso();
            String msg = "RISULTATO LANCIO " + res + ".";
            String sPedina = monopoli.gui.Pedina.idToName(g.getPedina().getId());
            msg += "\n" + sPedina.toUpperCase() + " AVANZA DI " + res + " CASELLE DA " + sCasellaOld.toUpperCase() + " A " + casellaNew.toUpperCase();
            Monopoli.getMonopoliGUI().infoPlayer(msg);

            //COMUNICAZIONE AL LIVELLO INFERIORE
            int casellaArrivo=g.getPedina().getPosizione().getId();
            casellaArrivo--;
            Monopoli.getMonopoliCommunication().notificaMuoviPedina(g.getPedina().getId(),casellaArrivo );
            //GESTIONE ARRIVO CASELLA
            this.arrivoCasella(g, casellaOld,g.getPedina().getPosizione());
            

            
        /*}

        //CASO TURNO ALTRO GIOCATORE
        else {

            //TODO GESTIONE TURNO ALTRO GIOCATORE
            //POSSIBILE?
        }*/

        return res;

    }

    public void inizioTurno() {
        //CASO TURNO MIO
        //if (this.ricavaGiocatoreSessione().getIdOrdine() == prossimoGiocatore) {
            Monopoli.getMonopoliGUI().abilitaInizioTurno();
            Monopoli.getMonopoliGUI().infoPlayer("INIZIA IL TUO TURNO!");
        //}
    }

    //GESTIONE ARRIVO PEDINA SU CASELLA
    public void arrivoCasella(Giocatore g,Casella cPartenza,Casella c) {

        boolean mia=false;
        Proprieta p=null;



        //VERIFICO SE SONO PASSATO PER IL VIA

        if(c.getId() < cPartenza.getId()) {
            Monopoli.getMonopoliGUI().appendInfoPlayer("SEI PASSATO PER IL VIA! GUADAGNI 20000 EURO");
            banca.spostaBanconote(2, 10000, banca.getBanconoteLista(), g.getBanconote());
            this.getGameToGUI().aggiornaSoldi();
        }

        //VERIFICO SE LA CASELLA DOVE ARRIVO E' MIA
        Iterator it = g.getProprieta().iterator();
        while(it.hasNext() && !mia) {
            p = (Proprieta)it.next();
            if (p.getNome().compareTo(c.getNome()) == 0)
                    mia=true;

        }

        if(mia) {
            if(c instanceof Terreno) {
                //se la casella ?? associata ad una mia propriet?? e la propriet?? ?? un terreno attivo la possibilit?? di comprare case/hotel

                Terreno t = (Terreno)c;
                //OTTENTO LA PROPRIETA' COLLEGATA
                Proprieta prop = (Proprieta)mazzoProprieta.getCarta(t.getId());
                int costoCasa = prop.getCostoCasa();
                int costoAlbergo = prop.getCostoAlbergo();

                int nCase = this.contaCase(t.getCostruzioni());
                int nHotel = this.contaHotel(t.getCostruzioni());
                if(nCase >= 4 || nHotel >= 1) {
                    String s = "SEI ARRIVATO A " + t.getNomeEsteso().toUpperCase() + ". " + "SEI SU UN TUO TERRITORIO, PUOI ACQUISTARE UNA CASA O UN HOTEL";
                    Monopoli.getMonopoliGUI().appendInfoPlayer(s);
                    s = "COSTO CASA: " + costoCasa + "EURO. COSTO ALBERGO: " + costoAlbergo + "EURO.";
                    Monopoli.getMonopoliGUI().appendInfoPlayer(s);
                    Monopoli.getMonopoliGUI().abilitaHotel();
                    Monopoli.getMonopoliGUI().abilitaCasa();

                }
                else   {
                    String s = "SEI ARRIVATO A " + t.getNomeEsteso().toUpperCase() + ". " + "SEI SU UN TUO TERRITORIO, PUOI ACQUISTARE UNA CASA";
                    Monopoli.getMonopoliGUI().appendInfoPlayer(s);
                    s = "COSTO CASA: " + costoCasa + "EURO. COSTO ALBERGO: " + costoAlbergo + "EURO.";
                    Monopoli.getMonopoliGUI().appendInfoPlayer(s);
                    Monopoli.getMonopoliGUI().abilitaCasa();
                    
                }


            }




        }

        //VERIFICO SE DI UN GIOCATORE E DEVO PAGARE...
        else if(c instanceof Possedimento) {
            Proprieta prop = (Proprieta) mazzoProprieta.getCarta(c.getId());
            if (prop.getProprietario() != 0) {
                int costo = costoSoggiorno((Possedimento)c, prop);
                String s = "SEI ARRIVATO SU UN TERRENO DEL GIOCATORE " + ricavaGiocatore(prop.getProprietario()).getNome().toUpperCase() + "!";
                Monopoli.getMonopoliGUI().appendInfoPlayer(s);
                s = stampaCasellaAttuale();
                Monopoli.getMonopoliGUI().appendInfoPlayer(s);
                s = "DEVI PAGARE " + costo + " EURO";
                Monopoli.getMonopoliGUI().appendInfoPlayer(s);

                //PAGAMENTO
                 //prelevo i soldi dal giocatore
                ArrayList<Banconota> soldi = this.banca.ottieniSoldi(g.getBanconote(), costo);
                if(banca.contaSoldi(soldi) != 0)
                    this.banca.incassa(soldi);
                else
                    Monopoli.getMonopoliGUI().appendInfoPlayer("NON SI DISPONE DELLA SOMMA SUFFICIENTE...!");
                this.getGameToGUI().aggiornaSoldi();

                //comunica la notizia
                Monopoli.getMonopoliCommunication().notificaPagamento(costo, getGiocatoreSessione(), prop.getProprietario());
            }

            //ALTRIMENTI ABILITO L'ACQUISTO
            else {


            if(c instanceof Possedimento) {
               Possedimento poss = (Possedimento)c;
               String s =  "SEI ARRIVATO A " + poss.getNomeEsteso().toUpperCase() + ". " + "SEI SU UN POSSEDIMENTO LIBERO, VUOI ACQUISTARLO?";
                Monopoli.getMonopoliGUI().appendInfoPlayer(s);
               s = "COSTO ACQUISTO DI QUESTA PROPRIETA': " + prop.getValore() + "EURO";
               Monopoli.getMonopoliGUI().appendInfoPlayer(s);
               Monopoli.getMonopoliGUI().abilitaAcquisto();
            }
            else
                Monopoli.getMonopoliGUI().appendInfoPlayer("SEI ARRIVATO A " + c.getNomeEsteso().toUpperCase());

            }

        }

        //VERIFICO SE E' UNA CASELLA SPECIALE
        else if(c.getNomeEsteso().compareTo("Imprevisto") == 0) {
            gestioneImprevisto();
        }

        else if(c.getNomeEsteso().compareTo("Probabilit??") == 0) {
            gestioneProbabilita();
        }

        else if(c.getNome().compareTo("patrimoniale") == 0) {
            Monopoli.getMonopoliGUI().appendInfoPlayer("SEI ARRIVATO SULLA TASSA PATRIMONIALE. DEVI PAGARE 10000 EURO!");
            //gestione effetto tassa
            //Sposto i soldi dal giocatore alla banca
            ArrayList<Banconota> soldi = this.banca.ottieniSoldi(g.getBanconote(), 10000);
            this.banca.incassa(soldi);
            this.getGameToGUI().aggiornaSoldi();
             if(banca.contaSoldi(soldi) == 0) {
                Monopoli.getMonopoliGUI().appendInfoPlayer("NON SI POSSEDIONO I SOLDI PER PAGARE...!");
            }
            Monopoli.getMonopoliCommunication().notificaMsg(g.getNome().toUpperCase() + " PAGA 10000€ PER LA TASSA PATRIMONIALE");
        }

        else if(c.getNome().compareTo("lusso") == 0) {
            Monopoli.getMonopoliGUI().appendInfoPlayer("SEI ARRIVATO SULLA TASSA DI LUSSO. DEVI PAGARE 20000 EURO!!!!");
            //gestione effetto tassa
            //Sposto i soldi dal giocatore alla banca
            ArrayList<Banconota> soldi = this.banca.ottieniSoldi(g.getBanconote(), 20000);
            this.banca.incassa(soldi);
            this.getGameToGUI().aggiornaSoldi();
            if(banca.contaSoldi(soldi) == 0) {
                Monopoli.getMonopoliGUI().appendInfoPlayer("NON SI POSSEDIONO I SOLDI PER PAGARE...!");
            }
            Monopoli.getMonopoliCommunication().notificaMsg(g.getNome().toUpperCase() + " PAGA 20000??? PER LA TASSA DI LUSSO");

        }

        else if(c.getNome().compareTo("via") == 0) {
        }
        else if(c.getNome().compareTo("parcheggio") == 0) {
        }
        else if(c.getNome().compareTo("transito") == 0) {
        }


        //ALTRIMENTI ABILITO LA POSSIBILITA' DI ACQUISTARLA
        else
        {
            Monopoli.getMonopoliGUI().appendInfoPlayer("SEI ARRIVATO A " + c.getNomeEsteso().toUpperCase() + ". CASO NON GESTITO!!!");
        }

        //PROPONGO PASSAGGIO TURNO SE E' OK

        Monopoli.getMonopoliGUI().AggiornaPannelloDiComando("Azione","PassaTurno");
    }


    public int contaCase(List<Costruzione> c) {
        int res = 0;
        Iterator it = c.iterator();
        while(it.hasNext()) {
            if(it.next() instanceof Casa)
                res++;
        }
        return res;
    }


    public int contaHotel(List<Costruzione> c) {
        int res = 0;
        Iterator it = c.iterator();
        while(it.hasNext()) {
            if(it.next() instanceof Albergo)
                res++;
        }
        return res;
    }

    public boolean aggiungiCasa() {
        boolean res = true;
        Giocatore g = this.ricavaGiocatoreSessione();
        Terreno t = (Terreno)g.getPedina().getPosizione();
        //ottengo propriet?? collegata
        Proprieta prop = (Proprieta)mazzoProprieta.getCarta(t.getId());
        int costoCasa = prop.getCostoCasa();
        int nHotel = contaHotel(t.getCostruzioni());
        if(banca.contaSoldi(g.getBanconote()) >= costoCasa) {

        //PRELEVO I SOLDI
        ArrayList<Banconota> soldi = this.banca.ottieniSoldi(g.getBanconote(), costoCasa);
        this.banca.incassa(soldi);
        this.getGameToGUI().aggiornaSoldi();
        //aggiungo la casa
        t.getCostruzioni().add(new Casa());
        int nCase = contaCase(t.getCostruzioni());

        if (nCase>= 4)
            Monopoli.getMonopoliGUI().abilitaHotel();
        }
        else
            res=false;
        return res;

    }


    public boolean aggiungiHotel() {
        //VERIFICO SE E' IL PRIMO HOTEL CHE AGGIUNGO

        boolean res = true;
        Giocatore g = this.ricavaGiocatoreSessione();
        Terreno t = (Terreno)g.getPedina().getPosizione();
        //ottengo propriet?? collegata
        Proprieta prop = (Proprieta)mazzoProprieta.getCarta(t.getId());
        int costoHotel = prop.getCostoAlbergo();
        int nHotel = contaHotel(t.getCostruzioni());
        if(banca.contaSoldi(g.getBanconote()) >= costoHotel) {
        //PRELEVO I SOLDI
        ArrayList<Banconota> soldi = this.banca.ottieniSoldi(g.getBanconote(), costoHotel);
        this.banca.incassa(soldi);
        this.getGameToGUI().aggiornaSoldi();

        if(nHotel == 0) {
            t.setCostruzioni(Collections.synchronizedList(new ArrayList<Costruzione>()));
        }
        t.getCostruzioni().add(new Albergo());
        }
        else
            res=false;
        return res;

    }

    public String stampaCasellaAttuale() {
        Giocatore g = this.ricavaGiocatoreSessione();
        Casella c = (Casella)g.getPedina().getPosizione();
        String s = this.getTabellone().stampaCasella(c);
        return s;
    }

    public void passaTurno() {

        //Resetto
        Monopoli.getMonopoliGUI().azzeraPulsanti();
        Monopoli.getMonopoliGUI().infoPlayer("");

        //Giocatore g = this.ricavaGiocatoreSessione().getNext();
        //this.setProssimoGiocatore(g.getNext().getIdOrdine());
        //Monopoli.getMonopoliGUI().infoPlayer("PASSAGGIO TURNO A GIOCATORE N??" + g.getIdOrdine());
        //TODO invio del token al giocatore successivo
        Monopoli.getMonopoliCommunication().passaTurno();
        //da commentare!
        //TODO
        //inizioTurno();
 }


    public boolean acquistaProprieta() {
        boolean res = true;
        Giocatore g = this.ricavaGiocatoreSessione();
        ArrayList<Banconota> soldi;
        Possedimento t = (Possedimento)g.getPedina().getPosizione();
        Proprieta acquisto=(Proprieta)getMazzoProprieta().getCarta(t.getId());

        //verifico la possibilit?? di pagamento

        //prelevo i soldi dal giocatore
        soldi = this.banca.ottieniSoldi(g.getBanconote(), acquisto.getValore());

        if(banca.contaSoldi(soldi) != 0) {
            this.banca.incassa(soldi);
        this.getGameToGUI().aggiornaSoldi();

        //trovata la carta, effettuo il cambio< di proprietario
        g.getProprieta().add((Proprieta) acquisto);
        acquisto.setProprietario(g.getId());

        //AGGIORNO GUI
        ArrayList<String> a = new ArrayList();
        ArrayList<Proprieta> possedimenti = g.getProprieta();
        Iterator it = possedimenti.iterator();
        while(it.hasNext())
            a.add(((Proprieta)it.next()).getNomeEsteso());
        Monopoli.getMonopoliGUI().AggiornaSommario("possedimenti", a);
        //comunico
        Monopoli.getMonopoliCommunication().notificaAcquistoProprieta(getGiocatoreSessione(),acquisto.getId());
        }

        else
            res = false;


        return res;


    }


    public void gestioneImprevisto() {
            Giocatore g = this.ricavaGiocatoreSessione();
            ArrayList<Banconota> soldi;
            CartaImprevisto i = (CartaImprevisto)this.mazzoImprevisti.getCarteMazzo(1).get(0);
            String s = i.getTesto();
            String msg = s;
            int amount = i.getAmount();
            Monopoli.getMonopoliGUI().appendInfoPlayer("SEI ARRIVATO SU UN CASELLA IMPREVISTO: " + s);
            //Sposto i soldi dal giocatore alla banca

            soldi = this.banca.ottieniSoldi(g.getBanconote(), amount);
            this.banca.incassa(soldi);
            this.getGameToGUI().aggiornaSoldi();
            if(banca.contaSoldi(soldi) == 0) {
                Monopoli.getMonopoliGUI().appendInfoPlayer("NON SI POSSEDIONO I SOLDI PER PAGARE...!");
            }
            
    }

    public void gestioneProbabilita() {
            Giocatore g = this.ricavaGiocatoreSessione();
            CartaProbabilita i = (CartaProbabilita)this.mazzoProbabilita.getCarteMazzo(1).get(0);
            String s = i.getTesto();
            String msg = s;
            int amount = i.getAmount();
            Monopoli.getMonopoliGUI().appendInfoPlayer("SEI ARRIVATO SU UN CASELLA PROBABILITA' " + s);
            //Sposto i soldi dal giocatore alla banca
            g.setBanconote(banca.sommaDenaro(this.banca.ottieniSoldi(banca.getBanconoteLista(), amount),g.getBanconote()));
            this.getGameToGUI().aggiornaSoldi();
            this.banca.stampaSoldi(g.getBanconote());

    }

    public int costoSoggiorno(Possedimento t, Proprieta p) {
        int nCase=0;
        int nHotel=0;
        int nAnaloghe=0;
        int val=0;

        if(t instanceof Terreno) {
        nCase = contaCase(((Terreno)t).getCostruzioni());
        nHotel = contaHotel(((Terreno)t).getCostruzioni());
        val += p.getRendita()[1] * nCase;
        val += p.getRendita()[5] * nHotel;
        if(val == 0)
            val = p.getRendita()[0];

        return val;
        }

        else {
            nAnaloghe = contaAnaloghe((Possedimento)t);
            val = p.getRendita()[nAnaloghe];
            return val;
        }
    }

    public void testTabellone() {

        Terreno t = (Terreno)tabellone.getCasella(1);
        List<Costruzione> a = Collections.synchronizedList(new ArrayList<Costruzione>());
        a.add(new Casa());
        t.setCostruzioni(a);

        t = (Terreno)tabellone.getCasella(3);
        a = Collections.synchronizedList(new ArrayList<Costruzione>());
        a.add(new Casa());
        a.add(new Casa());
        a.add(new Casa());
        t.setCostruzioni(a);

        t = (Terreno)tabellone.getCasella(6);
        a = Collections.synchronizedList(new ArrayList<Costruzione>());
        a.add(new Casa());
        a.add(new Casa());
        a.add(new Casa());
        a.add(new Albergo());
        t.setCostruzioni(a);

        t = (Terreno)tabellone.getCasella(8);
        a = Collections.synchronizedList(new ArrayList<Costruzione>());
        a.add(new Albergo());
        t.setCostruzioni(a);


    }

    public int getCasellaAttuale() {
        Giocatore g = this.ricavaGiocatoreSessione();
        Casella c = (Casella)g.getPedina().getPosizione();
        return c.getId();

    }


    public int contaAnaloghe(Possedimento s) {
        int counter=0;
        Proprieta pr = null;
        Casella c;
        ArrayList<Proprieta> pList = ricavaGiocatoreSessione().getProprieta();
        Iterator<Proprieta> it = pList.iterator();
        if(s instanceof Societa) {
            while(it.hasNext())
            pr = it.next();
            c = this.tabellone.getCasella(pr.getId() - 1);
            if(c instanceof Societa)
                counter++;
        }
        else if(s instanceof Stazione) {
            while(it.hasNext())
            pr = it.next();
            c = this.tabellone.getCasella(pr.getId() - 1);
            if(c instanceof Stazione)
                counter++;
        }
        else
            counter=1;


        return counter;
    }


    public Giocatore ricavaGiocatore(int id) {
        int idGiocatore = id;
        Giocatore g = null;
        Iterator it = this.giocatore.iterator();
        Boolean stop = false;
        while(it.hasNext() && stop == false) {
            g = (Giocatore)it.next();
            if (g.getId() == idGiocatore)
                stop=true;
        }
        return g;
    }

    public Proprieta ricavaProprieta(int id) {

        return (Proprieta)this.getMazzoProprieta().getCarta(id);

    }


    public int ricavaIdGiocatore(String nome) {
        String nomeGiocatore=nome;
        Giocatore g = null;
        Iterator it = this.giocatore.iterator();
        Boolean stop = false;
        while(it.hasNext() && stop == false) {
            g = (Giocatore)it.next();
            if (g.getNome().compareTo(nomeGiocatore) == 0)
                stop=true;
        }
        return g.getId();
    }


    public int getSoldiGiocatore(int id) {
        Giocatore g = ricavaGiocatore(id);
        int soldi=0;
        soldi = getBanca().contaSoldi(g.getBanconote());
        return soldi;
}

    public ArrayList<String> getPossedimenti(int id) {
        ArrayList<String> as = new ArrayList<String>();
        Giocatore g = ricavaGiocatore(id);
        Iterator it = g.getProprieta().iterator();
        while(it.hasNext())
            as.add(((Proprieta)it.next()).getNomeEsteso());

        return as;
    }

    public String getPedinaGiocatore(int id) {
        Giocatore g = ricavaGiocatore(id);
        String pedina = null;
        pedina = monopoli.gui.Pedina.idToName(g.getPedina().getId());
        return pedina;
    }

     public int ricavaIdProp(String proprieta) {
        Proprieta g = null;
        Iterator it = this.mazzoProprieta.getMazzoCarte().iterator();
        Boolean stop = false;
        while(it.hasNext() && stop == false) {
            g = (Proprieta)it.next();
            if (g.getNomeEsteso().compareTo(proprieta) == 0)
                stop=true;
        }
        return g.getId();
    }

    public int getCostoCasa(int idProprieta) {
        Proprieta p = ricavaProprieta(idProprieta);
        int valore=0;
        valore = p.getCostoCasa();
        return valore;
    }

    public int getCostoHotel(int idProprieta) {
        Proprieta p = ricavaProprieta(idProprieta);
        int valore=0;
        valore = p.getCostoAlbergo();
        return valore;
    }

    public int getRenditaCasa(int idProprieta) {
        int i = idProprieta;
        Proprieta p = ricavaProprieta(idProprieta);
        int valore=0;
        valore = p.getRendita()[1];
        if(i == 6 || i== 13 || i==16 || i==26 || i== 29 || i==36)
            valore=0;
        return valore;
    }

    public int getRenditaHotel(int idProprieta) {
        int i = idProprieta;
        Proprieta p = ricavaProprieta(idProprieta);
        int valore=0;
        valore = p.getRendita()[5];
        if(i == 6 || i== 13 || i==16 || i==26 || i== 29 || i==36)
            valore=0;
        return valore;
    }

    public int getRenditaTerreno(int idProprieta) {
        int i = idProprieta;
        Proprieta p = ricavaProprieta(idProprieta);
        int valore=0;
        valore = p.getRendita()[0];
        if(i == 6 || i== 13 || i==16 || i==26 || i== 29 || i==36)
            valore=0;
        return valore;
    }

    public int getValoreProp(int idProprieta) {
        Proprieta p = ricavaProprieta(idProprieta);
        int valore=0;
        valore = p.getValore();
        return valore;
    }

    public int getRenditaSingola(int idProprieta) {
        int i = idProprieta;
        Proprieta p = ricavaProprieta(idProprieta);
        int valore=0;
        valore = p.getRendita()[0];
        if(i == 6 || i== 13 || i==16 || i==26 || i== 29 || i==36)
            return valore;
        else
            return 0;
    }

    public int getRenditaMultipla(int idProprieta) {
        int i = idProprieta;
        Proprieta p = ricavaProprieta(idProprieta);
        int valore=0;
        valore = p.getRendita()[5];
        if(i == 6 || i== 13 || i==16 || i==26 || i== 29 || i==36)
            return valore;
        else
            return 0;
    }


    public int getNumCase(int idProprieta) {
        int i = idProprieta;
        Proprieta p = ricavaProprieta(idProprieta);
        int valore=0;
        if(i == 6 || i== 13 || i==16 || i==26 || i== 29 || i==36)
            return 0;
        else {
            Terreno t=(Terreno)this.tabellone.getCasella(idProprieta-1);
            return contaCase(t.getCostruzioni());
        }
    }

    public int getNumHotel(int idProprieta) {
        int i = idProprieta;
        Proprieta p = ricavaProprieta(idProprieta);
        int valore=0;
        if(i == 6 || i== 13 || i==16 || i==26 || i== 29 || i==36)
            return 0;
        else {
            Terreno t=(Terreno)this.tabellone.getCasella(idProprieta-1);
            return contaHotel(t.getCostruzioni());
        }
    }



}


